import cv2
import numpy as np
import matplotlib.pyplot as plt

filename = 'code_of_teacher/lena.bmp'


def kind_of_function():
    src = cv2.imread(filename, cv2.IMREAD_COLOR)
    src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)
    gray = cv2.cvtColor(src, cv2.COLOR_RGB2GRAY)
    # Sobel边缘
    sobel_x = cv2.Sobel(gray, 2, 1, 0, ksize=3)
    sobel_y = cv2.Sobel(gray, 2, 0, 1, ksize=3)
    sobel = np.abs(sobel_x) + np.abs(sobel_y)
    # laplacian边缘
    #第二个参数表示图像深度，为存储每个像素的位数，
    # 2表示2的2次方便是每个像素可以有四种颜色
    laplacian = cv2.Laplacian(gray, 2, ksize=3)
    # canny 边缘步骤：
    #1、用高斯滤波器平滑图像
    #2、用一阶差分算子计算梯度幅值和方向
    #3、对梯度幅值进行非极大值抑制
    #4、用双阈值算法检测和连接边缘
    # canny认为在50到150之间的值，有可能是边缘点，然后根据周围有没有边缘点来确定当前点是否为边缘点
    canny = cv2.Canny(gray, 50, 150)
    # 显示原始图像
    ax1 = plt.subplot(221)
    ax1.set_title('src')
    plt.imshow(src),plt.xticks([]),plt.yticks([])
    # 显示sobel边缘
    ax2 =plt.subplot(222)
    ax2.set_title('sobel')
    plt.imshow(sobel),plt.xticks([]),plt.yticks([])
    # 显示laplacian边缘
    ax3 = plt.subplot(223)
    ax3.set_title('laplacian')
    plt.imshow(laplacian), plt.xticks([]), plt.yticks([])
    # 显示canny边缘
    ax4 = plt.subplot(224)
    ax4.set_title('canny')
    plt.imshow(canny), plt.xticks([]), plt.yticks([])
    plt.show()


kind_of_function()
